package com.mueblesgl.proyecto.dao.mysql;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

import com.mueblesgl.proyecto.dao.interfaces.ProductoDAO;
import com.mueblesgl.proyecto.entidades.Unidad;
import com.mueblesgl.proyecto.daofactory.MySqlDAOFactory;
import com.mueblesgl.proyecto.entidades.Cliente;
import com.mueblesgl.proyecto.entidades.Recurso;
import com.mueblesgl.proyecto.entidades.Producto;
import com.mueblesgl.proyecto.util.Constantes;

public class MySqlProductoDAO implements ProductoDAO {

	@Override
	public Producto consultarProducto(int idProducto) {
		
		Producto producto = null;
		
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "select * from producto where idproducto = " + idProducto + ";";
			ResultSet rs = stmt.executeQuery(query);

			if (rs.next()) {
				producto = new Producto();
				producto.setIdProducto(rs.getInt("idproducto"));
				producto.setNombre(rs.getString("nombre"));
				producto.setPrecio(rs.getDouble("precio"));
				producto.setTipo(rs.getString("tipo"));
				producto.setCaracteristicas(rs.getString("caracteristicas"));
				producto.setIdProcedimiento(rs.getInt("idprocedimiento"));			
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return producto;
	}

	@Override
	public Vector<Producto> listarProductos() {
		Vector<Producto> productos = new Vector<Producto>();
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "SELECT * FROM producto WHERE estado = '" + Constantes.ESTADO_ACTIVO + "' ORDER BY nombre;";
					
			Producto producto = null;
			ResultSet rs = stmt.executeQuery(query);

			while (rs.next()) {
				producto = new Producto();
				
				producto.setIdProducto(rs.getInt("idproducto"));
				producto.setNombre(rs.getString("nombre"));
				producto.setTipo(rs.getString("tipo"));
				producto.setPrecio(rs.getDouble("precio"));
				producto.setCaracteristicas(rs.getString("caracteristicas"));
				producto.setEstado(rs.getString("estado"));
				productos.add(producto);
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return productos;
	}

	
	@Override
	public boolean registrarProducto(Producto producto) {
		int filas_afectadas = 0;

		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();

			String sql = "INSERT INTO PRODUCTO(nombre, precio, tipo, estado, caracteristicas) "
					+ "VALUES ('"
					+ producto.getNombre()
					+ "', "
					+ producto.getPrecio()
					+ ", '"
					+ producto.getTipo()
					+ "', '"
					+ Constantes.ESTADO_ACTIVO
					+ "', '"
					+ producto.getCaracteristicas() + "');";			
			filas_afectadas = stmt.executeUpdate(sql);
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (filas_afectadas == 1)
			return true;

		return false;
	}

	@Override
	public Vector<Producto> buscarProductos(String buscar) {
		Vector<Producto> productos = new Vector<Producto>();
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "SELECT * FROM producto WHERE upper(nombre) LIKE '" + buscar.toUpperCase() + "%'" +
					" AND estado = '"+Constantes.ESTADO_ACTIVO+"';";
					
			Producto producto = null;
			ResultSet rs = stmt.executeQuery(query);

			while (rs.next()) {
				producto = new Producto();
				
				producto.setIdProducto(rs.getInt("idproducto"));
				producto.setNombre(rs.getString("nombre"));
				producto.setTipo(rs.getString("tipo"));
				
				productos.add(producto);
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return productos;
	}

	@Override
	public boolean modificarProducto(Producto producto) {
		int filas_afectadas = 0;

		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();

			String sql = "UPDATE PRODUCTO "
					+ "SET nombre = '"
					+ producto.getNombre()
					+ "', precio = "
					+ producto.getPrecio()
					+ ", tipo = '"
					+ producto.getTipo()
					+ "', caracteristicas = '"
					+ producto.getCaracteristicas() + "' " 
					+"WHERE idproducto = "+producto.getIdProducto()+";";
			
			filas_afectadas = stmt.executeUpdate(sql);
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (filas_afectadas == 1)
			return true;

		return false;
	}
	
	@Override
	public boolean registrarMaterial(Recurso recurso) {
		
		int filas_afectadas = 0;		
		
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
				
			String sql = "INSERT INTO RECURSO(nombre, cantidad,costo, idunidad, estado) "
					+ "VALUES ('"
					+ recurso.getNombre()
					+ "' , "
					+ recurso.getCantidad() 
					+  " , "
					+ recurso.getCosto()
					+  " , "
					+ recurso.getIdUnidad() 
					+ " , '"
					+Constantes.ESTADO_ACTIVO
					+"');";
			
			System.out.println(sql);			
			
			filas_afectadas = stmt.executeUpdate(sql);
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (filas_afectadas == 1)
			return true;

		return false;
	}
	
	@Override
	public Vector<Producto> buscarProductosPorTipo(String tipo) {
		Vector<Producto> productos = new Vector<Producto>();
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "SELECT * FROM producto WHERE tipo LIKE '" + tipo.toUpperCase() + "%'" +
					" AND estado = '" + Constantes.ESTADO_ACTIVO + "'";
					
			Producto producto = null;
			ResultSet rs = stmt.executeQuery(query);

			while (rs.next()) {
				producto = new Producto();
				
				producto.setIdProducto(rs.getInt("idproducto"));
				producto.setNombre(rs.getString("nombre"));
				producto.setPrecio(rs.getDouble("precio"));
				producto.setTipo(rs.getString("tipo"));
				producto.setCaracteristicas(rs.getString("caracteristicas"));
				producto.setIdProcedimiento(rs.getInt("idprocedimiento"));
				
				productos.add(producto);
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return productos;
	}
	
	public boolean eliminarProducto(int idProducto) {
		boolean retorno = false;
		
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();

			String sql = "UPDATE PRODUCTO "
					+ "SET estado = '"
					+ Constantes.ESTADO_INACTIVO					
					+"' WHERE idproducto = "+ idProducto +";";
			
			int filas_afectadas = stmt.executeUpdate(sql);
			
			if(filas_afectadas == 1) retorno = true;
			else retorno = false;
			
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return retorno;
	}

	@Override
	public Recurso consultarMaterial(int idMaterial) {
		Recurso recurso = null;
		
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "select r.idrecurso,r.nombre,r.cantidad,r.costo,r.idunidad,u.abreviatura from recurso r,unidad u where r.idrecurso = " + idMaterial + " and r.idunidad=u.idunidad ;";
			ResultSet rs = stmt.executeQuery(query);

			if (rs.next()) {
				recurso = new Recurso();
				recurso.setIdRecurso(rs.getInt("r.idrecurso"));
				recurso.setNombre(rs.getString("r.nombre"));
				recurso.setCantidad(rs.getDouble("r.cantidad"));
				recurso.setCosto(rs.getDouble("r.costo"));
				recurso.setIdUnidad(rs.getInt("r.idUnidad"));
				recurso.setAbreviatura(rs.getString("u.abreviatura"));
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return recurso;
	}

	@Override
	public Vector<Unidad> listarUnidades() {
		Vector<Unidad> unidades = new Vector<Unidad>();
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "SELECT * FROM unidad WHERE estado = '" + Constantes.ESTADO_ACTIVO + "' ORDER BY nombre;";
					
			Unidad unidad = null;
			ResultSet rs = stmt.executeQuery(query);

			while (rs.next()) {
				unidad = new Unidad();
				
				unidad.setIdUnidad(rs.getInt("idunidad"));
				unidad.setNombre(rs.getString("nombre"));
				unidad.setAbreviatura(rs.getString("abreviatura"));			
				
				unidades.add(unidad);
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return unidades;
	}
	
	@Override
	public Unidad consultarUnidad(int idUnidad) {
		
		Unidad unidad = null;
		
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "select * from unidad where idunidad = " + idUnidad + ";";
			ResultSet rs = stmt.executeQuery(query);

			if (rs.next()) {
				unidad = new Unidad();
				unidad.setIdUnidad(rs.getInt("idunidad"));
				unidad.setNombre(rs.getString("nombre"));
				unidad.setAbreviatura(rs.getString("abreviatura"));						
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return unidad;
	}

	@Override
	public Vector<Cliente> listarClientes() {
		Vector<Cliente> clientes = new Vector<Cliente>();
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "SELECT * FROM cliente WHERE estado = '" + Constantes.ESTADO_ACTIVO + "' ORDER BY nombre;";
					
			Cliente cliente = null;
			ResultSet rs = stmt.executeQuery(query);

			while (rs.next()) {
				cliente = new Cliente();
				
				cliente.setIdCliente(rs.getInt("idCliente"));
				cliente.setNombre(rs.getString("nombre"));
				cliente.setApellido(rs.getString("apellido"));
				cliente.setDni(rs.getInt("dni"));
				cliente.setTelefono(rs.getInt("telefono"));
				cliente.setEstado(rs.getString("estado"));
				
				clientes.add(cliente);
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return clientes;
	}

}
